import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTokenTime } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  // 设置基地址，基地址从环境变量里读取
  baseURL: process.env.VUE_APP_BASE_API,
  // withCredentials: true, // send cookies when cross-domain requests

  // 设置超时时间：所以现在设置的是5秒
  // 也就是说发了请求后5秒没影响就给你报超时错
  timeout: 5000 // request timeout
})

// 添加一个service的请求拦截器
service.interceptors.request.use(async config => {
  // config就是本次发请求的信息
  // 判断有没有token
  if (store.getters.token) {
    // 获取一下记录token的时间
    const start = getTokenTime()

    // 获取一下当前时间
    const now = Date.now()

    // 算出时间差
    const hour = (now - start) / 1000 / 3600

    // 判断是否超过1小时
    if (hour >= 1) {
      // 代表token过期
      await store.dispatch('user/logout')
      Message.error('token已过期，请重新登录')
      router.push('/login')
      // return代表不往下执行，所以这个请求不会发送
      return
    }

    config.headers.Authorization = 'Bearer ' + store.getters.token
  }

  // 发出这个请求
  return config
},
err => {
  return Promise.reject(err)
})

// 添加一个service的响应拦截器
service.interceptors.response.use(res => {
  // 获取到本次请求得到的数据
  const data = res.data

  // 判断本次请求是否成功
  if (data.success) {
    // 如果响应成功，则正常给他返回数据
    return data
  } else {
    // 证明失败，我们需要让外面的catch被调用
    // 要让catch被调用，就要手动抛出一个错误，并把服务器返回的消息抛回去
    return Promise.reject(data.message)
  }
}, async err => {
  if (err.response.data.code === 10002) {
    // 证明token过期,重新登录
    // 打回登录之前得删除所有信息,调用logout方法
    await store.dispatch('user/logout')
    // 弹出一个错误提示
    Message.error('登录状态已过期，请重新登录！')
    router.push('/login')
  } else {
    // 响应错误触发这里
    return Promise.reject(err)
  }
})

export default service
